<?php
/**
* @desc Gi_View_Abstract clase abstracta con implenetacion del objeto view
*/
require_once "interface/Gi_View_Interface.php";

abstract class Gi_View_Abstract implements Gi_View_Interface {
  /**
  * @desc  donde estan los templates
  */
  protected $_path = null;
  
  /**
  * @desc Nombre del ultimo template renderizado
  */
  protected $_template_name = null;
  
  protected $_vars = array();
  
  public function __construct () {
  
  }
  /**
  * @desc Esta funcion es utilizada para renderizar un view script
  * @param string El nombre del archivo a renderizar
  */
  public function render ($file) {
    if (!is_string($file))
      throw new Gi_Exception("El nombre de archivo debe ser un string");
      
    $this->_template_name = $this->_path . DIRECTORY_SEPARATOR . $file;
    
    unset($file);
    
    $this->_run($this->_template_name);
    
    return $this;
  }
  
  /**
  * @desc Incluye un archivo que se le pase como parametro se utiliza para renderizar templates
  */
  public function _run() {
    include func_get_arg(0);
  }
  
  /**
  * @desc asigna variables en los templtes
  * @param string el nombre de la variable
  * @param mixed el valor para la variable
  */
  public function assign ($key, $value) {
    if (is_string($key)) {
      // assign by name and value
      if ('_' == substr($key, 0, 1)) {
        throw new Gi_Exception('no se pueden setear variables privadas o protected');  
      }
      $this->_vars[$key] = $value;
    } 
    else {
      throw new Gi_Exception('el valor de key solo puede ser un string');  
    }
    return $this;
  }
  
  /**
  * @desc devuelve todas las variables del template
  */
  public function get_vars () {
    return $this->_vars;
  }
  
  /**
  * @desc devuelve una variable
  * @param string el nombre de la variable
  */
  public function get_var ($key) {
    return $this->_vars[$key];
  }
  
  /**
  * @desc para poder usar los operadores ->
  */
  public function __get ($key) {
    return $this->get_var($key);  
  }
  
  /**
  * @desc para poder chequear con la funcion isset()
  * @param string el nombre de la variable
  */
  public function __isset ($key) {
    return isset($this->_vars[$key]);
  }
  
  /**
  * @desc borra una variable
  * @param string el nombre de la variable
  */
  public function clear ($key){
    unset($this->_vars[$key]);
  }
  
  /**
  * @desc borra todas las variables
  */
  public function clear_all (){
    $this->_vars = array();
  }
  
  /**
  * @desc indica en que directorio estan los script 
  * @param string el nombre del directorio 
  */
  public function set_script_path ($path) {
    $this->_path = $path;  
  }
  
  /**
  * @desc obtiene el scriptpath
  */
  public function get_script_path () {
    return $this->_path;
  }
  
  public function include_file($name, $var) {
    ob_start();
    $this->render($name);
    $this->assign($var,ob_get_contents());
    ob_end_clean();
  }
}